typedef int datatype;
typedef struct hnode
{
    datatype data;      //关键字
    …;                  //其它信息
    struct hnode *next; //指向下一个同义词的指针
} HNode;
#define m  … //m为散列表的容量
HNode *HashTbl[m];
#pragma region  【算法6 - 15】以拉链法处理冲突构造散列表的算法 
void CreateLHTbl(HNode *LHashTbl[m], datatype *eptr)
{ //用拉链法处理冲突建立散列表LHashTbl
    // eptr为待放入散列表中的数据基址，Hash()为散列函数
    int d;
    HNode *q;
    for (i = 0; i < m; i++)
        LHashTbl[i] = NULL; //散列表初始化
    while (eptr->data.key != 0)
    {                                       //待放入散列表的元素，其关键码0表示结束
        d = Hash(eptr->data.key);           //求当前元素的散列地址
        q = (HNode *)malloc(sizeof(HNode)); //申请新的一个结点空间
        q->data.key = eptr->data.key;       //填装结点信息
        …;
        q->next = LHashTbl[d]; //插入到同义词的链表
        LHashTbl[d] = q;
        eptr++; //指向下一个元素
    }
}
#pragma endregion
#pragma region 【算法6 - 16】以线性探测法处理冲突构造的散列表中的查找
int ReSeqHTbl(datetype SeqHTbl[], int m, keytype key)
{ // SeqHTbl是用线性探测法处理冲突建立的散列表，散列函数为Hash()，m为散列表的长度
    //查找关键码为key的元素，成功返回其地址，否则返回-1
    int d, begin; //求当前元素的散列地址，并将起始点记录在begin中
    begin = d = Hash(key);
    while (SeqHTbl[d].key != 0 && SeqHTbl[d].key != key)
    {
        d = (d + 1) % m;
        if (d == begin)
        {
            d = -1;
            break;
        } //表满且查找失败
    }
    if (d != -1 && SeqHTbl[d].key == 0)
        d = -1; //找到空单元，查找失败
    return d;   //查找成功返回的是地址，不成功为-1
}
#pragma endregion
#pragma region 【算法6 - 17】以拉链法处理冲突构造的散列表中的查找
HNode *CreateLHTbl(HNode *LHashTbl[m], keytype key)
{ // LHashTbl是用拉链法处理冲突建立的散列表，散列函数为Hash()，m为散列表的长度,查找关键码为key的元素，成功返回其地址，否则返回NULL
    int d;
    HNode *q;
    d = Hash(key);   //求当前元素的散列地址
    q = LhashTbl[d]; //同义词链表的头指针
    while (q)
    {
        if (q->data.key == key)
            break;
        else
            q = q->next;
    }
    return q;
}
#pragma endregion
